In [35]:
import kagglehub

# Importamos el dataset de imagenes de deteccion de tumores.
path = kagglehub.dataset_download("navoneel/brain-mri-images-for-brain-tumor-detection")

print("Path to dataset files:", path)
Path to dataset files: /kaggle/input/brain-mri-images-for-brain-tumor-detection
In [36]:
import numpy as np #Numpy para el manejo de arrays dataset y demas.
from tqdm import tqdm  #Para implementar barra de progreso
import cv2 #Extracion de caracteristicas carga de imagenes, normalizacion.....
import os # Libreria para creacion y manejo de ficheros.
import shutil
import itertools
import imutils
import matplotlib.pyplot as plt # Para graficas y demas.
from sklearn.preprocessing import LabelBinarizer # Importacion para el manejo de redes cnn
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, confusion_matrix

import plotly.graph_objs as go
from plotly.offline import init_notebook_mode, iplot
from plotly import tools

from tensorflow.keras.preprocessing.image import ImageDataGenerator #Libreria para la generacion de imagenes para el preprocesado
from keras.applications.vgg16 import VGG16, preprocess_input
from keras import layers
from keras.models import Model, Sequential #Importacion de modelos.
from tensorflow.keras.optimizers import Adam, RMSprop
from keras.callbacks import EarlyStopping

init_notebook_mode(connected=True)

RANDOM_SEED = 123
print("ok")
ok
In [37]:
pip install imutils
Requirement already satisfied: imutils in /usr/local/lib/python3.10/dist-packages (0.5.4)
Note: you may need to restart the kernel to use updated packages.
In [38]:
!apt-get install --fix-missing tree #Preparamos las carpetas para el entrenamiento de los datos.

#clear_output()

# Creamos las carpetas que contendrán las imágenes de entrenamiento
!mkdir TRAIN TEST VAL TRAIN/YES TRAIN/NO TEST/YES TEST/NO VAL/YES VAL/NO

!tree -d
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following NEW packages will be installed:
  tree
0 upgraded, 1 newly installed, 0 to remove and 129 not upgraded.
Need to get 47.9 kB of archives.
After this operation, 116 kB of additional disk space will be used.
Ign:1 http://archive.ubuntu.com/ubuntu jammy/universe amd64 tree amd64 2.0.2-1
Ign:1 http://archive.ubuntu.com/ubuntu jammy/universe amd64 tree amd64 2.0.2-1
Ign:1 http://archive.ubuntu.com/ubuntu jammy/universe amd64 tree amd64 2.0.2-1
Err:1 http://archive.ubuntu.com/ubuntu jammy/universe amd64 tree amd64 2.0.2-1
  Temporary failure resolving 'archive.ubuntu.com'
E: Failed to fetch http://archive.ubuntu.com/ubuntu/pool/universe/t/tree/tree_2.0.2-1_amd64.deb  Temporary failure resolving 'archive.ubuntu.com'
E: Internal Error, ordering was unable to handle the media swap
mkdir: cannot create directory ‘TRAIN’: File exists
mkdir: cannot create directory ‘TEST’: File exists
mkdir: cannot create directory ‘VAL’: File exists
mkdir: cannot create directory ‘TRAIN/YES’: File exists
mkdir: cannot create directory ‘TRAIN/NO’: File exists
mkdir: cannot create directory ‘TEST/YES’: File exists
mkdir: cannot create directory ‘TEST/NO’: File exists
mkdir: cannot create directory ‘VAL/YES’: File exists
mkdir: cannot create directory ‘VAL/NO’: File exists
/bin/bash: line 1: tree: command not found
In [39]:
IMG_PATH = '../input/brain-mri-images-for-brain-tumor-detection/' #Ruta para la obtencion de las imagenes. 
# Divide las imágenes del dataset original en train/val/test
for CLASS in os.listdir(IMG_PATH):
    if os.path.isfile(CLASS) == False and (CLASS == "yes" or CLASS == "no"):
        print(CLASS)
        IMG_NUM = len(os.listdir(IMG_PATH + CLASS))
        print(IMG_NUM)
        for n, FILE_NAME in enumerate(os.listdir(IMG_PATH + CLASS)):
            img = IMG_PATH + CLASS + '/' + FILE_NAME
            print(img)
            if n < 0.2 * IMG_NUM: #Condicional para que solo copie en la carpeta de testing el 0.2 de las imagenes.
                shutil.copy(img, 'TEST/' + CLASS.upper() + '/' + FILE_NAME)
                print("TO TEST")
            elif n < 0.8 * IMG_NUM: #Condicional para que se copie el 0.8.
                shutil.copy(img, 'TRAIN/' + CLASS.upper() + '/' + FILE_NAME)
                print("TO TRAIN")
            else:
                shutil.copy(img, 'VAL/' + CLASS.upper() + '/' + FILE_NAME)
                print("TO VAL")
no
98
../input/brain-mri-images-for-brain-tumor-detection/no/34 no.jpg
TO TEST
../input/brain-mri-images-for-brain-tumor-detection/no/N20.JPG
TO TEST
../input/brain-mri-images-for-brain-tumor-detection/no/N1.JPG
TO TEST
../input/brain-mri-images-for-brain-tumor-detection/no/49 no.jpg
TO TEST
../input/brain-mri-images-for-brain-tumor-detection/no/N15.jpg
TO TEST
../input/brain-mri-images-for-brain-tumor-detection/no/No18.jpg
TO TEST
../input/brain-mri-images-for-brain-tumor-detection/no/31 no.jpg
TO TEST
../input/brain-mri-images-for-brain-tumor-detection/no/no 6.jpg
TO TEST
../input/brain-mri-images-for-brain-tumor-detection/no/3 no.jpg
TO TEST
../input/brain-mri-images-for-brain-tumor-detection/no/no 5.jpeg
TO TEST
../input/brain-mri-images-for-brain-tumor-detection/no/no 1.jpg
TO TEST
../input/brain-mri-images-for-brain-tumor-detection/no/26 no.jpg
TO TEST
../input/brain-mri-images-for-brain-tumor-detection/no/N26.JPG
TO TEST
../input/brain-mri-images-for-brain-tumor-detection/no/N5.jpg
TO TEST
../input/brain-mri-images-for-brain-tumor-detection/no/6 no.jpg
TO TEST
../input/brain-mri-images-for-brain-tumor-detection/no/No21.jpg
TO TEST
../input/brain-mri-images-for-brain-tumor-detection/no/17 no.jpg
TO TEST
../input/brain-mri-images-for-brain-tumor-detection/no/No22.jpg
TO TEST
../input/brain-mri-images-for-brain-tumor-detection/no/29 no.jpg
TO TEST
../input/brain-mri-images-for-brain-tumor-detection/no/46 no.jpg
TO TEST
../input/brain-mri-images-for-brain-tumor-detection/no/32 no.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/no/42 no.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/no/no 90.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/no/no 94.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/no/No19.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/no/47 no.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/no/N22.JPG
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/no/No12.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/no/15 no.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/no/20 no.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/no/No13.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/no/11 no.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/no/N11.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/no/No17.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/no/no 98.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/no/18 no.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/no/N19.JPG
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/no/25 no.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/no/24 no.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/no/no 91.jpeg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/no/45 no.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/no/22 no.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/no/No16.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/no/44no.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/no/4 no.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/no/36 no.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/no/8 no.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/no/48 no.jpeg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/no/No20.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/no/no 2.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/no/no 10.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/no/7 no.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/no/10 no.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/no/N17.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/no/14 no.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/no/no 8.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/no/38 no.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/no/40 no.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/no/no 9.png
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/no/N3.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/no/no 89.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/no/19 no.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/no/12 no.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/no/N2.JPG
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/no/No11.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/no/no 92.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/no/No14.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/no/39 no.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/no/no 7.jpeg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/no/27 no.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/no/5 no.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/no/no 95.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/no/no.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/no/no 3.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/no/No15.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/no/no 923.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/no/28 no.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/no/no 100.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/no/23 no.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/no/13 no.jpg
TO VAL
../input/brain-mri-images-for-brain-tumor-detection/no/37 no.jpg
TO VAL
../input/brain-mri-images-for-brain-tumor-detection/no/21 no.jpg
TO VAL
../input/brain-mri-images-for-brain-tumor-detection/no/30 no.jpg
TO VAL
../input/brain-mri-images-for-brain-tumor-detection/no/no 4.jpg
TO VAL
../input/brain-mri-images-for-brain-tumor-detection/no/9 no.jpg
TO VAL
../input/brain-mri-images-for-brain-tumor-detection/no/no 99.jpg
TO VAL
../input/brain-mri-images-for-brain-tumor-detection/no/N21.jpg
TO VAL
../input/brain-mri-images-for-brain-tumor-detection/no/50 no.jpg
TO VAL
../input/brain-mri-images-for-brain-tumor-detection/no/43 no.jpg
TO VAL
../input/brain-mri-images-for-brain-tumor-detection/no/no 96.jpg
TO VAL
../input/brain-mri-images-for-brain-tumor-detection/no/41 no.jpg
TO VAL
../input/brain-mri-images-for-brain-tumor-detection/no/N16.jpg
TO VAL
../input/brain-mri-images-for-brain-tumor-detection/no/no 97.jpg
TO VAL
../input/brain-mri-images-for-brain-tumor-detection/no/1 no.jpeg
TO VAL
../input/brain-mri-images-for-brain-tumor-detection/no/2 no.jpeg
TO VAL
../input/brain-mri-images-for-brain-tumor-detection/no/35 no.jpg
TO VAL
../input/brain-mri-images-for-brain-tumor-detection/no/N6.jpg
TO VAL
../input/brain-mri-images-for-brain-tumor-detection/no/33 no.jpg
TO VAL
yes
155
../input/brain-mri-images-for-brain-tumor-detection/yes/Y115.JPG
TO TEST
../input/brain-mri-images-for-brain-tumor-detection/yes/Y192.JPG
TO TEST
../input/brain-mri-images-for-brain-tumor-detection/yes/Y162.jpg
TO TEST
../input/brain-mri-images-for-brain-tumor-detection/yes/Y9.jpg
TO TEST
../input/brain-mri-images-for-brain-tumor-detection/yes/Y108.jpg
TO TEST
../input/brain-mri-images-for-brain-tumor-detection/yes/Y155.JPG
TO TEST
../input/brain-mri-images-for-brain-tumor-detection/yes/Y106.jpg
TO TEST
../input/brain-mri-images-for-brain-tumor-detection/yes/Y258.JPG
TO TEST
../input/brain-mri-images-for-brain-tumor-detection/yes/Y103.jpg
TO TEST
../input/brain-mri-images-for-brain-tumor-detection/yes/Y185.jpg
TO TEST
../input/brain-mri-images-for-brain-tumor-detection/yes/Y180.jpg
TO TEST
../input/brain-mri-images-for-brain-tumor-detection/yes/Y120.JPG
TO TEST
../input/brain-mri-images-for-brain-tumor-detection/yes/Y54.jpg
TO TEST
../input/brain-mri-images-for-brain-tumor-detection/yes/Y165.JPG
TO TEST
../input/brain-mri-images-for-brain-tumor-detection/yes/Y112.JPG
TO TEST
../input/brain-mri-images-for-brain-tumor-detection/yes/Y99.JPG
TO TEST
../input/brain-mri-images-for-brain-tumor-detection/yes/Y3.jpg
TO TEST
../input/brain-mri-images-for-brain-tumor-detection/yes/Y184.JPG
TO TEST
../input/brain-mri-images-for-brain-tumor-detection/yes/Y82.jpg
TO TEST
../input/brain-mri-images-for-brain-tumor-detection/yes/Y169.jpg
TO TEST
../input/brain-mri-images-for-brain-tumor-detection/yes/Y146.JPG
TO TEST
../input/brain-mri-images-for-brain-tumor-detection/yes/Y147.JPG
TO TEST
../input/brain-mri-images-for-brain-tumor-detection/yes/Y116.JPG
TO TEST
../input/brain-mri-images-for-brain-tumor-detection/yes/Y27.jpg
TO TEST
../input/brain-mri-images-for-brain-tumor-detection/yes/Y73.jpg
TO TEST
../input/brain-mri-images-for-brain-tumor-detection/yes/Y181.jpg
TO TEST
../input/brain-mri-images-for-brain-tumor-detection/yes/Y81.jpg
TO TEST
../input/brain-mri-images-for-brain-tumor-detection/yes/Y161.JPG
TO TEST
../input/brain-mri-images-for-brain-tumor-detection/yes/Y17.jpg
TO TEST
../input/brain-mri-images-for-brain-tumor-detection/yes/Y69.jpg
TO TEST
../input/brain-mri-images-for-brain-tumor-detection/yes/Y158.JPG
TO TEST
../input/brain-mri-images-for-brain-tumor-detection/yes/Y32.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y186.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y259.JPG
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y42.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y250.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y58.JPG
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y60.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y252.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y182.JPG
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y154.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y79.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y31.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y98.JPG
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y91.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y95.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y22.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y35.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y33.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y247.JPG
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y19.JPG
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y160.JPG
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y13.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y29.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y55.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y4.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y50.JPG
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y114.JPG
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y26.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y257.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y97.JPG
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y14.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y25.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y170.JPG
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y51.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y34.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y39.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y15.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y104.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y187.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y167.JPG
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y40.JPG
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y38.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y111.JPG
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y37.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y24.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y157.JPG
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y6.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y28.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y164.JPG
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y30.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y90.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y92.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y86.JPG
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y46.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y248.JPG
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y1.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y2.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y62.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y67.JPG
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y109.JPG
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y117.JPG
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y194.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y71.JPG
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y7.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y59.JPG
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y246.JPG
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y66.JPG
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y148.JPG
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y243.JPG
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y56.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y18.JPG
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y23.JPG
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y96.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y195.JPG
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y65.JPG
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y16.JPG
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y193.JPG
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y45.JPG
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y53.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y245.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y159.JPG
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y12.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y100.JPG
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y102.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y75.JPG
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y256.JPG
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y10.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y253.JPG
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y105.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y166.JPG
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y61.jpg
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y47.JPG
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y255.JPG
TO TRAIN
../input/brain-mri-images-for-brain-tumor-detection/yes/Y70.jpg
TO VAL
../input/brain-mri-images-for-brain-tumor-detection/yes/Y168.jpg
TO VAL
../input/brain-mri-images-for-brain-tumor-detection/yes/Y163.JPG
TO VAL
../input/brain-mri-images-for-brain-tumor-detection/yes/Y188.jpg
TO VAL
../input/brain-mri-images-for-brain-tumor-detection/yes/Y242.JPG
TO VAL
../input/brain-mri-images-for-brain-tumor-detection/yes/Y21.jpg
TO VAL
../input/brain-mri-images-for-brain-tumor-detection/yes/Y36.JPG
TO VAL
../input/brain-mri-images-for-brain-tumor-detection/yes/Y254.jpg
TO VAL
../input/brain-mri-images-for-brain-tumor-detection/yes/Y183.jpg
TO VAL
../input/brain-mri-images-for-brain-tumor-detection/yes/Y74.jpg
TO VAL
../input/brain-mri-images-for-brain-tumor-detection/yes/Y251.JPG
TO VAL
../input/brain-mri-images-for-brain-tumor-detection/yes/Y52.jpg
TO VAL
../input/brain-mri-images-for-brain-tumor-detection/yes/Y153.jpg
TO VAL
../input/brain-mri-images-for-brain-tumor-detection/yes/Y156.JPG
TO VAL
../input/brain-mri-images-for-brain-tumor-detection/yes/Y11.jpg
TO VAL
../input/brain-mri-images-for-brain-tumor-detection/yes/Y77.jpg
TO VAL
../input/brain-mri-images-for-brain-tumor-detection/yes/Y249.JPG
TO VAL
../input/brain-mri-images-for-brain-tumor-detection/yes/Y41.jpg
TO VAL
../input/brain-mri-images-for-brain-tumor-detection/yes/Y76.jpg
TO VAL
../input/brain-mri-images-for-brain-tumor-detection/yes/Y78.jpg
TO VAL
../input/brain-mri-images-for-brain-tumor-detection/yes/Y20.jpg
TO VAL
../input/brain-mri-images-for-brain-tumor-detection/yes/Y85.JPG
TO VAL
../input/brain-mri-images-for-brain-tumor-detection/yes/Y49.JPG
TO VAL
../input/brain-mri-images-for-brain-tumor-detection/yes/Y244.JPG
TO VAL
../input/brain-mri-images-for-brain-tumor-detection/yes/Y8.jpg
TO VAL
../input/brain-mri-images-for-brain-tumor-detection/yes/Y107.jpg
TO VAL
../input/brain-mri-images-for-brain-tumor-detection/yes/Y113.JPG
TO VAL
../input/brain-mri-images-for-brain-tumor-detection/yes/Y101.jpg
TO VAL
../input/brain-mri-images-for-brain-tumor-detection/yes/Y89.JPG
TO VAL
../input/brain-mri-images-for-brain-tumor-detection/yes/Y44.JPG
TO VAL
../input/brain-mri-images-for-brain-tumor-detection/yes/Y92.png
TO VAL

Podriamos balancear el dataset antes del proceso de carga de las imagenes en los directorios para mejorar los resultados. En este caso vemos que el dataset es muy pequeño asique el balanceo quiza no sea lo mas correcto aqui.

In [40]:
def load_data(dir_path, img_size=(100, 100)):
    # Creamos dos arrays vacios para para almacenar etiquetas . La funcion recibe dos parametros , directorio de las carpetas y y el tamaño de las imagenes. 
    X = []
    y = []
    i = 0
    labels = dict() #Mapeo de las etiquetas numericas a los nombres de las clases.

    for path in tqdm(sorted(os.listdir(dir_path))):
        if not path.startswith('.'):
            labels[i] = path 
            for file in os.listdir(dir_path + '/' + path): 
                if not file.startswith('.'):
                    img = cv2.imread(dir_path + '/' + path + '/' + file)
                    X.append(img)
                    y.append(i)
            i += 1

    X = np.array(X, dtype=object) #Conversion de las listas en array de numpy.
    y = np.array(y)

    print(f'{len(X)} imágenes cargadas desde: {dir_path}.')
    return X, y, labels
In [41]:
TRAIN_DIR = 'TRAIN/'
TEST_DIR = 'TEST/'
VAL_DIR = 'VAL/'
IMG_SIZE = (224, 224)

# Cargamos cada uno de los conjuntos de imágenes: entrenamiento, prueba y validación
X_train, y_train, labels = load_data(TRAIN_DIR, IMG_SIZE)
X_test, y_test, _ = load_data(TEST_DIR, IMG_SIZE)
X_val, y_val, _ = load_data(VAL_DIR, IMG_SIZE)
100%|██████████| 2/2 [00:00<00:00,  8.83it/s]
152 imágenes cargadas desde: TRAIN/.
100%|██████████| 2/2 [00:00<00:00, 29.48it/s]
51 imágenes cargadas desde: TEST/.
100%|██████████| 2/2 [00:00<00:00, 23.14it/s]
50 imágenes cargadas desde: VAL/.

In [42]:
#Imprimimos el contenido de labels para saber que podamos separar la funcion que nos pide en el ejercicio en en dos partes. Las imagenes que su clase es No y yes.
print(labels)
{0: 'NO', 1: 'YES'}
In [43]:
import numpy as np
import matplotlib.pyplot as plt
import cv2

def plot_samples(X, y, labels, class_label, num_samples): #Funcion que recibe 4 parametros, imagenes etiquetas, mapeo, clase y numero de imagenes que quieres obtener.

    print(('Tumor: NO' if class_label == 0 else 'Tumor: YES').center(50))

    
    # Obtenemos los indices para buscar las imagenes de la clase que queramos mostrar.
    class_indices = np.where(y == class_label)[0]

    # Mostrar las imágenes
    plt.figure(figsize=(12, 8))



    
    for i in range(num_samples):
        idx = class_indices[i]
        plt.subplot(5, 6, i + 1)
        plt.imshow(cv2.cvtColor(X[idx], cv2.COLOR_BGR2RGB))  # Convierte de BGR a RGB
        plt.title(labels[y[idx]])  # Muestra la etiqueta de la imagen
        plt.axis("off")
    
    plt.tight_layout()
    plt.show()

Vista de las imagenes que pertenecen a los patientes sin tumor cerebral.

In [44]:
plot_samples(X_train,y_train,labels,0,30)
                    Tumor: NO                     
No description has been provided for this image

Vista de las imagenes que pertenecen a los patientes con tumor cerebral.

In [45]:
plot_samples(X_train,y_train,labels,1,30)
                    Tumor: YES                    
No description has been provided for this image
In [46]:
def crop_imgs(set_name, add_pixels_value=0): #Funcion para recortar los extremos de las imagenes.
     

    set_new = []

    for img in set_name:
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        gray = cv2.GaussianBlur(gray, (5, 5), 0)

        # Umbralizar la imagen, luego realizar una serie de erosiones y dilataciones para eliminar pequeños ruidos
        thresh = cv2.threshold(gray, 25, 255, cv2.THRESH_BINARY)[1] 
        thresh = cv2.erode(thresh, None, iterations=2)
        thresh = cv2.dilate(thresh, None, iterations=2)

        # Encuentra los contornos en la imagen umbralizada y toma el más grande
        cnts, _ = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
        cnt = max(cnts, key=cv2.contourArea)

        # Encuentra los píxeles extremos
        extLeft = tuple(cnt[cnt[:, :, 0].argmin()][0])
        extRight = tuple(cnt[cnt[:, :, 0].argmax()][0])
        extTop = tuple(cnt[cnt[:, :, 1].argmin()][0])
        extBot = tuple(cnt[cnt[:, :, 1].argmax()][0])

        ADD_PIXELS = add_pixels_value
        new_img = img[extTop[1]-ADD_PIXELS:extBot[1]+ADD_PIXELS, extLeft[0]-ADD_PIXELS:extRight[0]+ADD_PIXELS].copy()
        set_new.append(new_img)

    return np.array(set_new, dtype=object)
In [47]:
X_train_crop = crop_imgs(set_name=X_train) #Guardamos en las nuevas variables las imagenes ya recortadas.
X_val_crop = crop_imgs(set_name=X_val)
X_test_crop = crop_imgs(set_name=X_test)

Vista de las imagenes que pertenecen a los patientes sin tumor cerebral recortadas para mejorar el procesado.

In [48]:
plot_samples(X_train_crop,y_train,labels,0,30)
                    Tumor: NO                     
No description has been provided for this image

Vista de las imagenes que pertenecen a los patientes con tumor cerebral.

In [49]:
plot_samples(X_train_crop,y_train,labels,1,30)
                    Tumor: YES                    
No description has been provided for this image
In [50]:
def save_new_images(x_set, y_set, folder_name):
    i = 0
    for (img, imclass) in zip(x_set, y_set):
        if imclass == 0:
            cv2.imwrite(folder_name + 'NO/' + str(i) + '.jpg', img)
        else:
            cv2.imwrite(folder_name + 'YES/' + str(i) + '.jpg', img)
        i += 1
In [51]:
# Creamos las carpetas donde guardaremos las imágenes
!mkdir TRAIN_CROP TEST_CROP VAL_CROP TRAIN_CROP/YES
!mkdir TRAIN_CROP/NO TEST_CROP/YES TEST_CROP/NO VAL_CROP/YES
!mkdir VAL_CROP/NO

# Creamos la nueva estructura con las imagenes ya recortadas.
save_new_images(X_train_crop, y_train, folder_name='TRAIN_CROP/')
save_new_images(X_val_crop, y_val, folder_name='VAL_CROP/')
save_new_images(X_test_crop, y_test, folder_name='TEST_CROP/')
mkdir: cannot create directory ‘TRAIN_CROP’: File exists
mkdir: cannot create directory ‘TEST_CROP’: File exists
mkdir: cannot create directory ‘VAL_CROP’: File exists
mkdir: cannot create directory ‘TRAIN_CROP/YES’: File exists
mkdir: cannot create directory ‘TRAIN_CROP/NO’: File exists
mkdir: cannot create directory ‘TEST_CROP/YES’: File exists
mkdir: cannot create directory ‘TEST_CROP/NO’: File exists
mkdir: cannot create directory ‘VAL_CROP/YES’: File exists
mkdir: cannot create directory ‘VAL_CROP/NO’: File exists
In [52]:
def preprocess_imgs(set_name, img_size): #Esta funcion toma las imagenes ya recortadas anteriormente y las redimensiona al valor aportado en el parametro img_size

    set_new = []
    for img in set_name:
        img = cv2.resize(
            img,
            dsize=img_size,
            interpolation=cv2.INTER_CUBIC
        )
        set_new.append(preprocess_input(img))
    return np.array(set_new)
In [53]:
X_train_prep = preprocess_imgs(set_name=X_train_crop, img_size=(224, 224)) #Tamaño que añadimos es 224*224
X_test_prep = preprocess_imgs(set_name=X_test_crop, img_size=(224, 224))
X_val_prep = preprocess_imgs(set_name=X_val_crop, img_size=(224, 224))

Vista de las imagenes que pertenecen a los patientes sin tumor y habiendoles aplicado el preprocesado.

In [54]:
plot_samples(X_train_prep ,y_train,labels,0,30)
                    Tumor: NO                     
No description has been provided for this image

Vista de las imagenes que pertenecen a los patientes sin tumor y habiendoles aplicado el preprocesado.

In [55]:
plot_samples(X_train_prep ,y_train,labels,1,30)
                    Tumor: YES                    
No description has been provided for this image
In [56]:
TRAIN_DIR = 'TRAIN_CROP/' #Con imageData generator generamos imagenes de entrenamiento con aumento de datos en tiempo real.
VAL_DIR = 'VAL_CROP/'

train_datagen = ImageDataGenerator(         #Parametros para el desplazamiento hgasta el 10% del ancho de la imagen.
                     rotation_range=15,
                     width_shift_range=0.1,
                     height_shift_range=0.1,
                     shear_range=0.1,
                     brightness_range=[0.5, 1.5],
                     horizontal_flip=True,
                     vertical_flip=True,
                     preprocessing_function=preprocess_input
)

test_datagen = ImageDataGenerator(
                     preprocessing_function=preprocess_input
)

train_generator = train_datagen.flow_from_directory(      #Sirve para generar imagenes de entrenamiento a partir del directorio que le pasen como valor
                     TRAIN_DIR,
                     color_mode='rgb',
                     target_size=IMG_SIZE,
                     batch_size=32,
                     class_mode='binary',
                     seed=RANDOM_SEED
)

validation_generator = test_datagen.flow_from_directory(
                     VAL_DIR,
                     color_mode='rgb',
                     target_size=IMG_SIZE,
                     batch_size=16,
                     class_mode='binary',
                     seed=RANDOM_SEED
)
Found 152 images belonging to 2 classes.
Found 50 images belonging to 2 classes.
In [57]:
# Cargamos un modelo preenetrenado y le añadimos nosotros las capas que queramos
base_model = VGG16(
    weights="/kaggle/input/pesosvgg16/vgg16_weights_tf_dim_ordering_tf_kernels_notop.h5",
    include_top=False,
    input_shape=IMG_SIZE + (3,)
)

NUM_CLASSES = 1

model = Sequential() #Modelo sequential
model.add(base_model) #Le agregamos el modelo preentrenado
model.add(layers.Flatten()) #Capa desalida
model.add(layers.Dropout(0.5)) #Reduccion el sobreajuste.
model.add(layers.Dense(NUM_CLASSES, activation='sigmoid')) #Capa densa con activation sigmoid

model.layers[0].trainable = False

model.compile( #Compilacion del modelo con un Rmsprop de optimizador.
    loss='binary_crossentropy',
    optimizer=RMSprop(learning_rate=1e-4),
    metrics=['accuracy']
)

model.summary() #Mostamos resultados
Model: "sequential_1"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┓
┃ Layer (type)                         ┃ Output Shape                ┃         Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━┩
│ vgg16 (Functional)                   │ (None, 7, 7, 512)           │      14,714,688 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ flatten_1 (Flatten)                  │ (None, 25088)               │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ dropout_1 (Dropout)                  │ (None, 25088)               │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ dense_1 (Dense)                      │ (None, 1)                   │          25,089 │
└──────────────────────────────────────┴─────────────────────────────┴─────────────────┘
 Total params: 14,739,777 (56.23 MB)
 Trainable params: 25,089 (98.00 KB)
 Non-trainable params: 14,714,688 (56.13 MB)
In [58]:
EPOCHS = 30 #Iteraciones completas sobre el conjunto de datos.
batch_size = 32 #Aqui pondremos las muestras que e procesan simultaneamente durante el entrenamiento
val_batch_size = 16

es = EarlyStopping(
    monitor='accuracy',
    mode='max',
    patience=6
)

history = model.fit(  #Entrenamiento del modelo y valoracion del modelo
    train_generator,
    steps_per_epoch=len(X_train) // batch_size,
    epochs=EPOCHS,
    validation_data=validation_generator,
    validation_steps=len(X_test) // val_batch_size,
    callbacks=[es]
)
Epoch 1/30
/usr/local/lib/python3.10/dist-packages/keras/src/trainers/data_adapters/py_dataset_adapter.py:122: UserWarning:

Your `PyDataset` class should call `super().__init__(**kwargs)` in its constructor. `**kwargs` can include `workers`, `use_multiprocessing`, `max_queue_size`. Do not pass these arguments to `fit()`, as they will be ignored.

4/4 ━━━━━━━━━━━━━━━━━━━━ 51s 14s/step - accuracy: 0.5227 - loss: 5.6808 - val_accuracy: 0.5833 - val_loss: 2.0513
Epoch 2/30
1/4 ━━━━━━━━━━━━━━━━━━━━ 26s 9s/step - accuracy: 0.5625 - loss: 4.4821
/usr/lib/python3.10/contextlib.py:153: UserWarning:

Your input ran out of data; interrupting training. Make sure that your dataset or generator can generate at least `steps_per_epoch * epochs` batches. You may need to use the `.repeat()` function when building your dataset.

4/4 ━━━━━━━━━━━━━━━━━━━━ 28s 6s/step - accuracy: 0.5625 - loss: 4.4821 - val_accuracy: 1.0000 - val_loss: 6.0071e-04
Epoch 3/30
4/4 ━━━━━━━━━━━━━━━━━━━━ 49s 13s/step - accuracy: 0.5688 - loss: 3.8434 - val_accuracy: 0.6667 - val_loss: 2.1530
Epoch 4/30
4/4 ━━━━━━━━━━━━━━━━━━━━ 28s 6s/step - accuracy: 0.5312 - loss: 7.2679 - val_accuracy: 1.0000 - val_loss: 0.0597
Epoch 5/30
4/4 ━━━━━━━━━━━━━━━━━━━━ 50s 13s/step - accuracy: 0.6859 - loss: 3.4870 - val_accuracy: 0.6042 - val_loss: 1.5783
Epoch 6/30
4/4 ━━━━━━━━━━━━━━━━━━━━ 9s 180ms/step - accuracy: 0.4375 - loss: 5.0709 - val_accuracy: 0.0000e+00 - val_loss: 10.8640
Epoch 7/30
4/4 ━━━━━━━━━━━━━━━━━━━━ 50s 14s/step - accuracy: 0.6679 - loss: 3.0938 - val_accuracy: 0.6875 - val_loss: 2.0057
Epoch 8/30
4/4 ━━━━━━━━━━━━━━━━━━━━ 9s 181ms/step - accuracy: 0.4688 - loss: 4.7341 - val_accuracy: 1.0000 - val_loss: 0.3191
Epoch 9/30
4/4 ━━━━━━━━━━━━━━━━━━━━ 49s 13s/step - accuracy: 0.7442 - loss: 2.7088 - val_accuracy: 0.7083 - val_loss: 1.7283
Epoch 10/30
4/4 ━━━━━━━━━━━━━━━━━━━━ 10s 181ms/step - accuracy: 0.6250 - loss: 3.2440 - val_accuracy: 0.5000 - val_loss: 8.4603
Epoch 11/30
4/4 ━━━━━━━━━━━━━━━━━━━━ 49s 13s/step - accuracy: 0.7241 - loss: 3.2934 - val_accuracy: 0.7083 - val_loss: 1.8957
Epoch 12/30
4/4 ━━━━━━━━━━━━━━━━━━━━ 9s 177ms/step - accuracy: 0.5000 - loss: 4.5809 - val_accuracy: 1.0000 - val_loss: 0.0022
Epoch 13/30
4/4 ━━━━━━━━━━━━━━━━━━━━ 74s 13s/step - accuracy: 0.6680 - loss: 4.2179 - val_accuracy: 0.7292 - val_loss: 1.5880
Epoch 14/30
4/4 ━━━━━━━━━━━━━━━━━━━━ 27s 6s/step - accuracy: 0.7188 - loss: 2.2785 - val_accuracy: 0.5000 - val_loss: 1.7420
Epoch 15/30
4/4 ━━━━━━━━━━━━━━━━━━━━ 51s 13s/step - accuracy: 0.7104 - loss: 2.1104 - val_accuracy: 0.7500 - val_loss: 2.0497
Epoch 16/30
4/4 ━━━━━━━━━━━━━━━━━━━━ 7s 180ms/step - accuracy: 0.4583 - loss: 5.4589 - val_accuracy: 1.0000 - val_loss: 0.0025
Epoch 17/30
4/4 ━━━━━━━━━━━━━━━━━━━━ 50s 13s/step - accuracy: 0.6988 - loss: 2.9430 - val_accuracy: 0.7083 - val_loss: 1.8751
In [59]:
# plot model performance
acc = history.history['accuracy']
val_acc = history.history['val_accuracy']
loss = history.history['loss']
val_loss = history.history['val_loss']
epochs_range = range(1, len(history.epoch) + 1)

plt.figure(figsize=(15, 5))

plt.subplot(1, 2, 1)
plt.plot(epochs_range, acc, label='Train Set')
plt.plot(epochs_range, val_acc, label='Val Set')
plt.legend(loc='best')
plt.xlabel('Epochs')
plt.ylabel('Accuracy')
plt.title('Model Accuracy')

plt.subplot(1, 2, 2)
plt.plot(epochs_range, loss, label='Train Set')
plt.plot(epochs_range, val_loss, label='Val Set')
plt.legend(loc='best')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.title('Model Loss')

plt.tight_layout()
plt.show()

print(history.history.keys())
No description has been provided for this image
dict_keys(['accuracy', 'loss', 'val_accuracy', 'val_loss'])
In [60]:
def plot_confusion_matrix(cm, classes,    #Definicion de la funcion para ver la matrix de confusion y valorar resultados.
                          normalize=False,
                          title='Confusion matrix',
                          cmap=plt.cm.Blues):
    """
    
    """
    plt.figure(figsize=(6, 6))
    plt.imshow(cm, interpolation='nearest', cmap=cmap)
    plt.title(title)
    plt.colorbar()
    tick_marks = np.arange(len(classes))
    plt.xticks(tick_marks, classes, rotation=90)
    plt.yticks(tick_marks, classes)

    if normalize:
        cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]

    thresh = cm.max() / 2.
    for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])):
        plt.text(j, i, cm[i, j],
                 horizontalalignment="center",
                 color="white" if cm[i, j] > thresh else "black")

    plt.tight_layout()
    plt.ylabel('True label')
    plt.xlabel('Predicted label')
    plt.show()
In [61]:
# validate on val set #Hacemos las prediciones del modelo con la matriz de confusion.
predictions = model.predict(X_val_prep)
predictions = [1 if x>=0.5 else 0 for x in predictions]

accuracy = accuracy_score(y_val, predictions)
print('Val Accuracy = %.2f%%' % accuracy)

confusion_mtx = confusion_matrix(y_val, predictions)
cm = plot_confusion_matrix(confusion_mtx, classes = list(labels.items()), normalize=False)
2/2 ━━━━━━━━━━━━━━━━━━━━ 14s 5s/step
Val Accuracy = 0.72%
No description has been provided for this image

Como podemos observar obtenemos un de accuracy de 0,72 lo que nos obligaria a intentar mejorar el modelo . Las posibles soluciones pasarian por aumentar el dataset, revisar los datos, cambiar los optimizadores, añadir capas y probar a compensar el desbalance de las clases.

Finalmente en esta actividad aprendemos a procesar imagenes,a redimensionarlas , recortar los bordes para poder preprocesarlas de la manera mas adecuada. Cargar las imagenes en distintos directorios. Cargar un modelo preentrenado , añadirselo al modelo que queramos utilizar y añadir capas para el entrenamiento del modelo.